package com.losalpes.catalog;

import com.losalpes.data.IPersistence;
import com.losalpes.data.IPersistenceData;
import com.losalpes.data.PersistenceDataMock;
import com.losalpes.persistence.entity.Mueble;
import com.losalpes.persistence.entity.Inventario;
import com.losalpes.persistence.entity.TipoMueble;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 * 
 * @author Camilo Alvarez
 */
@Stateless
public class CatalogServiceMock implements ICatalogService {

    private ArrayList<Mueble> ms = new ArrayList<Mueble>();
    private ArrayList<Inventario> iv = new ArrayList<Inventario>();
    @EJB
    private IPersistence persitencia;

    /**
     * Constructor por defecto
     */
    public CatalogServiceMock() {
//        for (int i = 0; i < 10; i++) {
//            Mueble m = new Mueble("001" + i, "Mueble" + i, "Descripción del mueble " + i,
//                    TipoMueble.Exterior, 3.25 * i,
//                    2.14 * i, 2.34 * i, 2.48 * i);
//            if ((i % 2)==0){
//                m.setMaterial("Madera");
//                m.setFoto("/img/LicoreraChina.jpg");
//            }
//            else {
//                m.setMaterial("Metal");
//                m.setFoto("/img/Escritorio.jpg");
//            }
//            ms.add(m);
//            Inventario in = new Inventario(m.getReferencia(), 3.46 * i, 2 * i);
//            iv.add(in);
//        }
        //this.persistence = new PersistenceDataMock();

    }

    public void add(Mueble mueble) {
//        Mueble unMueble= this.getMueblebyRef(cMueble.getReferencia());
//        if (unMueble==null) {
//            ms.add(cMueble);
//        } else {
//            ms.remove(unMueble);
//            ms.add(cMueble);
//        }
//
//         this.persistenciaData.persistirMueble(cMueble);

        if (this.persitencia.findById(Mueble.class, mueble.getReferencia())==null){
            this.persitencia.create(mueble);
        }
        else {
            this.persitencia.update(mueble);
        }
    }


    public void remove(Mueble mueble) {
        //ms.remove(cMueble);
        this.persitencia.delete(mueble);
    }

    public void delete(String cReferencia) {
        Mueble mueble = new Mueble();
        mueble=(Mueble) this.persitencia.findById(Mueble.class, cReferencia);
        this.persitencia.delete(mueble);
//        for (int i = 0; i < ms.size(); i++) {
//            Mueble m = ms.get(i);
//            if (m.getReferencia().equals(cReferencia)) {
//                ms.remove(i);
//                break;
//            }
//
//        }
    }

    public int CantidadMuebles()
    {
        return this.ms.size();
    }

    public Mueble getMueblebyRef(String cReferencia) {
        return (Mueble) this.persitencia.findById(Mueble.class, cReferencia);
//        for (int i = 0; i < ms.size(); i++) {
//            Mueble m = ms.get(i);
//            if (m.getReferencia().equals(cReferencia)) {
//                return m;
//            }
//        }
//        return null;
    }



    public void update(Mueble cMueble) {
        for (Iterator<Mueble> it = ms.iterator(); it.hasNext();) {
            Mueble mueble = it.next();
            if (mueble.getReferencia().equals(cMueble.getReferencia())) {
                mueble.setNombre(cMueble.getNombre());
                mueble.setDescripcion(cMueble.getDescripcion());
                mueble.setMaterial(cMueble.getMaterial());
                mueble.setTipo(cMueble.getTipo());
                mueble.setAlto(cMueble.getAlto());
                mueble.setAncho(cMueble.getAncho());
                mueble.setProfundidad(cMueble.getProfundidad());
                mueble.setColor(cMueble.getColor());
                mueble.setPeso(cMueble.getPeso());
                mueble.setFoto(cMueble.getFoto());
            }
        }
    }

    public Mueble findMuebleById(String referencia) {
        for (Iterator<Mueble> it = ms.iterator(); it.hasNext();) {
            Mueble mueble = it.next();
            if (mueble.getReferencia().equals(referencia)) {
                return mueble;
            }
        }

        return null;
    }

    public List<Mueble> findAllMuebles() {
        return this.persitencia.findAll(Mueble.class);
    }

    public ArrayList<Mueble> findMuebleByTipo(TipoMueble tipoProducto) {
        ArrayList<Mueble> productos = new ArrayList<Mueble>();

        for (Iterator<Mueble> it = this.ms.iterator(); it.hasNext();) {
            Mueble producto = it.next();
            if (producto.getTipo().equals(tipoProducto)) {
                productos.add(producto);
            }
        }

        return productos;
    }

     public ArrayList<Mueble> findMuebleByRef(String referencia) {
        ArrayList<Mueble> productos = new ArrayList<Mueble>();

        for (Iterator<Mueble> it = this.ms.iterator(); it.hasNext();) {
            Mueble producto = it.next();
            if (producto.getReferencia().equals(referencia)) {
                productos.add(producto);
            }
        }

        return productos;
    }


    public ArrayList<Mueble> findMuebleByName(String nombreProducto) {
        ArrayList<Mueble> productos = new ArrayList<Mueble>();

        for (Iterator<Mueble> it = this.ms.iterator(); it.hasNext();) {
            Mueble producto = it.next();
            if (producto.getNombre().equals(nombreProducto)) {
                productos.add(producto);
            }
        }

        return productos;
    }

    public void addInventario(Inventario inventario) {
        boolean existe = false;

        for (Iterator<Inventario> it = iv.iterator(); it.hasNext();) {
            Inventario inv = it.next();
            if (inv.getReferencia().equals(inventario.getReferencia())) {
                // Actualiza informacion en caso de que exista
                inv.setPrecio(inventario.getPrecio());
                inv.setCantidad(inventario.getCantidad());
                existe = true;
                break;
            }
            else
            {
                existe = false;
                break;
            }
        }

        if (existe) {
            //this.persistenciaData.persistirInventario(inventario);
            this.iv.add(inventario);
        }
    }

    public void updateInventario(ArrayList<Inventario> productosAdquiridos) {
        for (Iterator<Inventario> it = productosAdquiridos.iterator(); it.hasNext();) {
            Inventario inv = it.next();
            int posicion = this.iv.indexOf(it);
            
            // Actualiza el inventario
            Inventario actInv = this.iv.get(posicion);
            actInv.setCantidad(actInv.getCantidad() - inv.getCantidad() > 0 
                    ? actInv.getCantidad() - inv.getCantidad() : 0);
        }
    }

    /**
     * %&%
     */
    public ArrayList<Inventario> findAllInventario() {
        return this.iv;
    }

    public Inventario findInventarioMuebleByRef(String referencia) {
         for (Iterator<Inventario> it = iv.iterator(); it.hasNext();) {
            Inventario inventario = it.next();
            if (inventario.getReferencia().equals(referencia)) {
                return inventario;
            }
        }
        return null;
    }

    public Inventario findInventarioMueble(String pReferencia) {
        for (Iterator<Inventario> it = iv.iterator(); it.hasNext();) {
            Inventario inv = it.next();
            if (inv.getReferencia().equals(pReferencia)) {
                // Actualiza informacion en caso de que exista
                return inv;
            }
        }
        return null;
    }

     
}
